package com.atguigu.lease.admin.service.impl;

import com.atguigu.lease.admin.service.FileService;
import com.atguigu.lease.common.config.MinioConfig;
import io.minio.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * @author LOGIN
 * @title FileServiceImpl
 * @create 2025/6/23 12:40
 * @description
 */
@Service
public class FileServiceImpl implements FileService {
    /*
        分析：
            1、初始化minio客户端对象
            2、判断是否存在项目使用的桶，如果不存在则创建（需要设置 public读 private写 权限）
            3、将文件上传到 minio指定桶内
            4、拼接文件在minio内的路径返回
         实现：
            1、检查minio依赖是否引入
            2、创建MInio客户端对象：
                    ioc容器中是否有minio对象？
                            - 容器中没有minio客户端对象
                                原因： 1、minio依赖没有自定义springBoot自动配置文件（自定义springboot starter）
                                        2、springboot autoconfigure包自动配置文件 也没有minio的自动配置类
                     redis启动器引入后，容器会自动创建StringRedisTemplate和RedisTemplate对象 注入到ioc容器
                            - 原因： 自动配置
                                    redis启动器引入后 + spring autoconfigure包中自动配置文件包含了RedisAutoConfiguration自动配置类
                                    如果引入依赖中包含了自动配置类ConditionOnClass注解需要的类或 接口，那么 springboot会自动创建这个配置类对象注入到容器中
     */
    /*
            endpoint: http://192.168.174.100:9000
            accessKey: minioadmin
            secreKey: minioadmin
            bucket: stgy
     */
    @Autowired
    MinioClient minioClient;
    @Autowired
    MinioConfig minioConfig;
    @Override
    public String upload(MultipartFile file){        //创建minio客户端
        try {
            //3、上传文件到桶内
            //获取上传文件的 文件名名
            String filename = file.getOriginalFilename();
            // 生成唯一的文件名: 唯一字符串+ 原文件的扩展名
            // 20250624/1231421412414_qeqweq1.jpg
            //拼接桶内保存文件的目录路径+文件名
                                //                时分秒格式的时间
            String path = new SimpleDateFormat("yyyyMMdd").format(new Date())
                            //当前秒数
                    + "/" + System.currentTimeMillis()+"_"
                            //UUID
                    + UUID.randomUUID().toString().substring(0,6)
                            //文件名后缀
                    + filename.substring(filename.lastIndexOf("."));

            minioClient.putObject(PutObjectArgs.builder()  //putObject 通过文件流上传文件
                    //保存文件的桶
                    .bucket(minioConfig.getBucket())
                    //桶内文件的路径和名称
                    .object(path)
                    //     上传文件的文件流，              流内容字节大小，           分片大小（-1不分片）
                    .stream(file.getInputStream(),file.getInputStream().available(),-1)
                    .build());

            //4、拼接上传成功的文件地址

            return minioConfig.getEndpoint()+"/"+minioConfig.getBucket()+"/" + path;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    }

